package com.dlc.felear.xiaoensale.factory;


import android.util.Log;

import com.dlc.felear.xiaoensale.helper.JsonHelper;
import com.dlc.felear.xiaoensale.utils.HexUtil;
import com.dlc.felear.xiaoensale.utils.SendJbCmdUtil;

import java.nio.charset.StandardCharsets;

/**
 * 指令工厂- 拼接指令
 * Created by felear on 2018/8/6.
 */

public class CmdList {

    private static final String TAG = "CmdList";


    public static byte[] DcHotStatus() {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xab;
        //目标地址
        sendData[1] = (byte) 0x01;
        // 原地址
        sendData[2] = (byte) 0x00;
        //数据长度
        sendData[3] = (byte) 0x01;
        // 数据
        sendData[4] = (byte) 0x00;
        // 累加检验
        checkSum(sendData);
        Log.e(TAG, "DcHotStatusCrc:" + HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] DcHotStatusNew() {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xab;
        //目标地址
        sendData[1] = (byte) 0x01;
        // 原地址
        sendData[2] = (byte) 0x00;
        //数据长度
        sendData[3] = (byte) 0x01;
        // 数据
        sendData[4] = (byte) 0x00;
        // 累加检验
        checkSum(sendData);
        return sendData;
    }

    public static byte[] DcHotStatusCrc() {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xab;
        //目标地址
        sendData[1] = (byte) 0x01;
        // 原地址
        sendData[2] = (byte) 0x00;
        //数据长度
        sendData[3] = (byte) 0x01;
        // 数据
        sendData[4] = (byte) 0x00;
        // 累加检验
        checkCRC161(sendData);
        Log.e(TAG, "DcHotStatusCrc:" + HexUtil.bytes2HexString(sendData));
        return sendData;
    }

//    public static byte[] setDcHotCrc(Integer level, Integer temp) {
//
//       if(temp==0||level==0){
//           return new byte[]{(byte) 0xab,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x00
//                   , (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x31, (byte)0x67};
//       }else if(temp!=0&&level!=0){
//           return new byte[]{(byte) 0xab,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x01
//                   , (byte)0xFF, (byte)0x6E, (byte)0x00, (byte)0xA0, (byte)0x95};
//       }
//        return new byte[10] ;
//    }

    public static byte[] setDcHot(Integer level, Integer temp) {
        if (level > 255) {
            level = 255;
        }
        if (temp > 255) {
            temp = 255;
        }
//        Log.e(TAG, "level=" + level + " temp=" + temp);
        byte[] sendData = new byte[10];
        //帧头
        sendData[0] = (byte) 0xab;
        //目标地址
        sendData[1] = (byte) 0x01;
        // 原地址
        sendData[2] = (byte) 0x00;
        //数据长度
        sendData[3] = (byte) 0x04;
        sendData[4] = (byte) 0x01;
        // 功率
        sendData[5] = level.byteValue();
        // 温度
        sendData[6] = 0;
        sendData[7] = temp.byteValue();
        // 累加检验
        checkSum(sendData);
        Log.e(TAG, "hot:" + HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] setDcHotNew(Integer level, Integer temp) {
//        ab 01 00 04 01 00 04 55 00 5F
//        ab 01 00 04 01 01 04 55 00 60
        if (level > 255) {
            level = 255;
        }
        if (temp > 255) {
            temp = 255;
        }
//        Log.e(TAG, "level=" + level + " temp=" + temp);
        byte[] sendData = new byte[10];
        //帧头
        sendData[0] = (byte) 0xab;
        //目标地址
        sendData[1] = (byte) 0x01;
        // 原地址
        sendData[2] = (byte) 0x00;
        //数据长度
        sendData[3] = (byte) 0x04;
        sendData[4] = (byte) 0x01;
        // 功率
        sendData[5] = level.byteValue();
        // 温度
        sendData[6] = (byte) 0x04;
        sendData[7] = temp.byteValue();
        // 累加检验
        checkSum(sendData);
        Log.e(TAG, "hot:" + HexUtil.bytes2HexString(sendData));
        return sendData;
    }


    public static void checkSum(byte[] sendData) {
        int length = sendData.length;
        int result = 0;
        for (int i = 1; i < sendData.length - 2; i++) {
            result += (sendData[i] & 0xff);
        }
        byte[] tempArr = HexUtil.intToBytes(result);
        sendData[length - 1] = tempArr[3];
        sendData[length - 2] = tempArr[2];
    }


    public static byte[] connect() {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x10;
        // 命令长度
        sendData[2] = (byte) 0x02;
        sendData[3] = (byte) 0x01;
        // 命令长度
        sendData[4] = (byte) 0x02;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] result(int cmd, int result) {
        byte[] sendData = new byte[5];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) cmd;
        // 命令长度
        sendData[2] = (byte) result;
        //传感器编号
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    /**
     * 握手指令
     * @param
     * @return
     */
    public static byte[] handShade() {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x00;
        // 命令长度
        sendData[2] = (byte) 0x48;
        //传感器编号
        sendData[3] = (byte) 0x01;
        sendData[4] = (byte) 0x02;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionGzfz(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x21;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionYb(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x20;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionFw(int on, int drect) {
        on = on > 0 ? 1 : on;
        on = on < 0 ? 0 : on;
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x19;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        sendData[4] = (byte) drect;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionDc(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x13;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionDs(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x26;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionJR(int temp, int power) {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x21;
        // 命令长度
        sendData[2] = (byte) 0x02;
        //温度
        sendData[3] = (byte) temp;
        //档位
        sendData[4] = (byte) power;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionJsc(int num, int time) {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x14;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) num;
        sendData[4] = (byte) time;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionJc(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x23;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionPk(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x24;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionGg(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x18;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionGtfj(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x25;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionCc(int on, int time) {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x22;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //传感器编号
        sendData[4] = (byte) time;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionJyt(int num, int value, int id) {
        byte[] sendData = new byte[11];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x17;
        // 命令长度
        sendData[2] = (byte) 0x06;
        //传感器编号
        sendData[3] = (byte) num;
        byte[] temp = HexUtil.intToBytes(value);
        sendData[4] = temp[3];
        sendData[5] = temp[2];
        sendData[6] = temp[1];
        sendData[7] = temp[0];
        sendData[8] = (byte) id;
//        Log.e(TAG,"yt1:"+HexUtil.bytes2HexString(sendData));
        //crc检验
        checkCRC16(sendData);
//        Log.e(TAG,"yt2:"+HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] actionJgt(int num, int value, int id) {
        byte[] sendData = new byte[8];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x16;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) num;
        sendData[4] = (byte) value;
        sendData[5] = (byte) id;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionXg(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x12;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] actionXp(int on) {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x23;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) on;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }


    /**
     * @param size
     * @return
     */
    public static byte[] tranceBity(int size) {
        int crc = 0x7fff;
        size = 15 - size;
        crc = crc >> size;
        return HexUtil.intTwoBytes(crc);
    }

    //校验码CRC16
    private static void checkCRC16(byte[] bytes) {
        int crc = 0xffff;
        for (int i = 0; i < bytes.length - 2; i++) {
            crc ^= (bytes[i] & 0xff);
            for (int j = 0; j < 8; j++) {
                if ((crc & 1) == 1) {
                    crc >>= 1;
                    crc ^= 0xa001;
                } else {
                    crc >>= 1;
                }
            }
        }
        // 取高低位
        bytes[bytes.length - 1] = (byte) (crc >> 8);
        bytes[bytes.length - 2] = (byte) crc;
    }

    private static void checkCRC161(byte[] bytes) {
        int crc = 0x0000;
        for (int i = 1; i < bytes.length - 2; i++) {
            Log.e(TAG,"byte="+bytes[i]);
            crc ^= (bytes[i] & 0xff);
            for (int j = 0; j < 8; j++) {
                if ((crc & 1) == 1) {
                    crc >>= 1;
                    crc ^= 0x1021;
                } else {
                    crc >>= 1;
                }
            }
        }
        // 取高低位
        bytes[bytes.length - 1] = (byte) (crc >> 8);
        bytes[bytes.length - 2] = (byte) crc;
    }


    /**
     * 计算异或和
     *
     * @param bytes
     */
    private static void checkXOR8(byte[] bytes) {
        byte result = 0;
        for (int i = 0; i < bytes.length - 1; i++) {
            result ^= bytes[i];
        }

        bytes[bytes.length - 1] = result;
    }

    public static boolean checkSum16(byte[] bytes) {
        int result = 0;
        for (int i = 1; i < bytes.length - 2; i++) {
            result += bytes[i] & 0xff;
        }
        byte[] tempArr = HexUtil.intTwoBytes(result);
        if (tempArr[1] == bytes[bytes.length - 2] && tempArr[0] == bytes[bytes.length - 1]) {
            return true;
        }
        return false;
    }

    /**
     * 16位的crc校验
     *
     * @param bytes
     * @return
     */
    public static boolean checkDataComplete(byte[] bytes) {

        int crc = 0xffff;
        for (int i = 0; i < bytes.length - 2; i++) {
            crc ^= (bytes[i] & 0xff);
            for (int j = 0; j < 8; j++) {
                if ((crc & 1) == 1) {
                    crc >>= 1;
                    crc ^= 0xa001;
                } else {
                    crc >>= 1;
                }
            }

        }
        if (bytes[bytes.length - 1] == (byte) (crc >> 8) &&
                bytes[bytes.length - 2] == (byte) crc) {
            return true;
        }
        return false;
    }

    public static byte[] queryInputIoStatus(int add) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x02;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x00;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x34;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] setControlBoadBaudRate(int add, int value) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x38;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) value;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] queryOuputIoStatus(int add) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x01;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x00;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x1A;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] allOuputIoClose(int add) {
//        01 0F 00 00 00 1A 04 00 00 00 00 C1 D2
        byte[] sendData = new byte[13];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x0F;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x00;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x1A;
        sendData[6] = (byte) 0x04;
        sendData[7] = (byte) 0x00;
        sendData[8] = (byte) 0x00;
        sendData[9] = (byte) 0x00;
        sendData[10] = (byte) 0x00;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] allOuputIoOpen(int add) {
//        01 0F 00 00 00 1A 04 00 00 00 00 C1 D2
        byte[] sendData = new byte[13];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x0F;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x00;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x1A;
        sendData[6] = (byte) 0x04;
        sendData[7] = (byte) 0xFF;
        sendData[8] = (byte) 0xFF;
        sendData[9] = (byte) 0xFF;
        sendData[10] = (byte) 0xFF;
        checkCRC16(sendData);
        return sendData;
    }

    /**
     * 屏蔽主动上传
     *
     * @param add
     * @return
     */
    public static byte[] setControlSendModel(int add) {
//        01 06 00 4B 00 04 F8 1F
        byte[] sendData = new byte[8];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x4B;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x04;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] setControlMoudelAdd(int add, int newAdd) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x39;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) newAdd;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] controlOutputIo(int add, int num, int on) {
//        01 05 00 14 FF 00 CC 3E
        byte[] sendData = new byte[8];
        sendData[0] = (byte) add;
        sendData[1] = (byte) 0x05;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) num;
        sendData[4] = (byte) on;
        sendData[5] = (byte) 0x00;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }


    public static byte[] stepMotorZz1(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x67;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] stepMotorFz1(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x68;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] stepMotorZz(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x01;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] stepMotorFz(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x00;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    /**
     * 设置加速因子
     *
     * @param acceleration
     * @return
     */
    public static byte[] stepMotorAcceleration1(int addr, int acceleration) {
        if (acceleration < 0 || acceleration > 10) {
            acceleration = 5;
        }
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x64;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) acceleration;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    /**
     * 减速因子
     *
     * @param acceleration
     * @return
     */
    public static byte[] stepMotorAcceleration2(int addr, int acceleration) {
        if (acceleration < 0 || acceleration > 10) {
            acceleration = 5;
        }
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x65;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) acceleration;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    /**
     * 往返运动 value表示初始方向
     *
     * @param value
     * @return
     */
    public static byte[] stepMotorReRun(int addr, int value) {

        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x66;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) value;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }


    public static byte[] stepMotorStop(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x02;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] stepMotorPul(int addr, int pul) {
        if (pul < 0) {
            pul = 0;
        }
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x07;
        byte[] tempArr = HexUtil.intTwoBytes(pul);
        sendData[4] = tempArr[1];
        sendData[5] = tempArr[0];
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] stepMotorSpeed(int addr, int speed) {
        if (speed < SendJbCmdUtil.SPEED_L) {
            speed = SendJbCmdUtil.SPEED_L;
        }
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x05;
        byte[] tempArr = HexUtil.intTwoBytes(speed);
        sendData[4] = tempArr[1];
        sendData[5] = tempArr[0];
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] stepMotorAconut(int addr, int speed) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x06;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x04;
        byte[] tempArr = HexUtil.intTwoBytes(speed);
        sendData[4] = tempArr[1];
        sendData[5] = tempArr[0];
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] queryMotorSpeed(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x03;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x05;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x03;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] queryMotorPlus(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x03;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x07;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] queryMotorAconut(int addr) {
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x03;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x04;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        checkCRC16(sendData);
//        Log.e(TAG, HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] queryIOStatus() {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x07;
        // 命令长度
        sendData[2] = (byte) 0x01;
        //传感器编号
        sendData[3] = (byte) 0x00;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] OpenDO(int num, int delay) {
        byte[] sendData = new byte[8];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x06;
        // 命令长度
        sendData[2] = (byte) 0x02;
        //传感器编号
        sendData[3] = (byte) num;
        byte[] tempArr = HexUtil.intTwoBytes(delay);
        sendData[4] = tempArr[0];
        sendData[5] = tempArr[1];
//        sendData[4] = (byte) 0x00;
//        sendData[5] = (byte) 0xFF;
        //crc检验
        checkCRC16(sendData);
//        Log.e(TAG, "OpenDO data=" + HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] setSfSpeend(int num, int speed) {
//        speed=20;
        byte[] sendData = new byte[8];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x02;
        // 命令长度
        sendData[2] = (byte) 0x03;
        //传感器编号
        sendData[3] = (byte) num;
        byte[] tempArr = HexUtil.intTwoBytes(speed);
        sendData[4] = tempArr[1];
        sendData[5] = tempArr[0];
        //crc检验
        checkCRC16(sendData);
        Log.e(TAG, "speed:" + HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    /**
     * @param num  DO编号（Y1-Y12）->(W1-W12)
     * @param plus 脉冲数
     * @param base 脉冲倍数
     * @param flag 是否启动
     * @return 下位机总脉冲数=脉冲数X脉冲倍数
     */
    public static byte[] setLljPlus(int num, int plus, int base, int flag) {
//        speed=20;
        byte[] sendData = new byte[11];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x09;
        // 命令长度
        sendData[2] = (byte) 0x06;
        //传感器编号
        sendData[3] = (byte) num;
        byte[] tempArr = HexUtil.intTwoBytes(plus);
        sendData[4] = tempArr[1];
        sendData[5] = tempArr[0];
        byte[] basArr = HexUtil.intTwoBytes(base);
        sendData[6] = basArr[1];
        sendData[7] = basArr[0];
        sendData[8] = (byte) flag;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    /**
     * 停止指令
     *
     * @param num  电机编号
     * @param flag 减速 0减 1不减
     * @return
     */
    public static byte[] setSfStop(int num, int flag) {
        byte[] sendData = new byte[7];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x04;
        // 命令长度
        sendData[2] = (byte) 0x02;
        //传感器编号
        sendData[3] = (byte) num;
        sendData[4] = (byte) flag;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] setSfOncePlus(int num, int dir, int puls) {
        byte[] sendData = new byte[9];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x03;
        // 命令长度
        sendData[2] = (byte) 0x05;
        //传感器编号
        sendData[3] = (byte) num;
        sendData[4] = (byte) dir;
        byte[] tempArr = HexUtil.intTwoBytes(puls);
        sendData[5] = tempArr[1];
        sendData[6] = tempArr[0];
//        byte[] tempArr = HexUtil.intToBytes(puls);
//        sendData[5] = tempArr[0];
//        sendData[6] = tempArr[1];
//        sendData[7] = tempArr[2];
//        sendData[8] = tempArr[3];
        //crc检验
//        Log.e(TAG, "puls=" + puls + "tempArr=" + HexUtil.bytes2HexString(tempArr));
        checkCRC16(sendData);
//        Log.e(TAG, "sendData=" + HexUtil.bytes2HexString(sendData));
        return sendData;
    }

    public static byte[] setSfPlus(int num, int dir, int puls) {
        byte[] sendData = new byte[9];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x05;
        // 命令长度
        sendData[2] = (byte) 0x04;
        //传感器编号
        sendData[3] = (byte) num;
        sendData[4] = (byte) dir;
        byte[] tempArr = HexUtil.intTwoBytes(puls);
        sendData[5] = tempArr[1];
        sendData[6] = tempArr[0];
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] connectResult(String name) {
        byte[] tempValues=name.getBytes(StandardCharsets.US_ASCII);
        int length=tempValues.length;
        byte[] sendData = new byte[length+5];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x10;
        // 数据长度
        sendData[2] = (byte) length;
        for (int i = 0; i < length; i++) {
            sendData[i+3]=tempValues[i];
        }
        //传感器编号
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] sendIrData(byte operator,byte addr1,byte addr2,byte value) {
        byte[] sendData = new byte[5];
        //帧头
        sendData[0] = (byte) 0xFA;
        //功能码
        sendData[1] = (byte) operator;
        //地址1
        sendData[2] = (byte) addr1;
        //地址2
        sendData[3] = (byte) addr2;
        //值
        sendData[4] = (byte) value;
        return sendData;
    }

    public static byte[] bluetoothResult(String name) {
        byte[] tempValues=name.getBytes(StandardCharsets.US_ASCII);
        int length=tempValues.length;
        byte[] sendData = new byte[length+5];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x12;
        // 数据长度
        sendData[2] = (byte) length;
        for (int i = 0; i < length; i++) {
            sendData[i+3]=tempValues[i];
        }
        //传感器编号
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] bluetooth() {
        byte[] sendData = new byte[6];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x12;
        // 数据长度
        sendData[2] = (byte) 0x01;
        // 数据
        sendData[3] = (byte) 0x01;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] sendIrData1(byte addr1,byte addr2,byte value) {
        byte[] sendData = new byte[8];
        //帧头
        sendData[0] = (byte) 0xA5;
        //功能码
        sendData[1] = (byte) 0x11;
        // 数据长度
        sendData[2] = (byte) 0x03;
        // 地址位1
        sendData[3] = addr1;
        // 地址位2
        sendData[4] = addr2;
        // 值
        sendData[5] = value;
        //crc检验
        checkCRC16(sendData);
        return sendData;
    }
}
